1 矢量分析

使用SDK进行空间分析总体思路较为简单:

  1. 通过各种方法获取到需要参与空间分析的Geometry(例如通过Identify、Select方法等)
  2. 按照使用ArcGIS的常识或参考帮助文档把参数填进空间分析方法的参数中,并执行这一空间分析的方法
  3. 方法的返回值即为分析的结果

下面以创建缓冲区为例,说明一下核心代码思路。

  1. 根据使用ArcGIS的常识,创建缓冲区需要最基础的需要指定对谁创建,以及创建多大的缓冲区,那参数就对应于一个Geometry对象,一个数值
  2. 根据经验,缓冲区的英文是Buffer,所以调用Buffer方法
  3. 运行的结果是一个面,所以需要用Geometry类型的变量来接收放回的结果。
MapPoint point = new MapPoint(0,0);//创建一个Geometry
Geometry result = GeometryEngine.Buffer(point,10);//调用创建缓冲区方法

如此就能得到缓冲区的结果了,再参考2 符号绘制及符号系统 > 2.1 自行编程绘制类似的过程,根据得到的Geometry对象创建一个Graphic,添加至GraphicOverlay里面,再添加至MapView的GraphicOverlays里即可实现在地图上的显示。

如果是其他的分析方法,相应把方法名、参数、结果改改就能用了,常用的方法还有判断是否相交Intersects、裁剪Clip、联合Union、求相交部分Intersection、判断是否接触Touches、简化Simplify等,根据常理逻辑即可推断出使用方法,无需全部记忆。

2 空间数据编辑

本部分主要围绕FeatureTable类来实现对某一个要素的删除、新增、修改,相当于ArcGIS里面在属性表里面删除一行、修改一个属性或者在编辑工具中创建一个要素,操作逻辑也是大差不差的。

2.1 删除

  1. 获取FeatureTable对象(正向可以通过打开一份数据获得,反向可以通过FeatureLayer的FeatureTable属性获得)
  2. 调用FeatureTable对象的DeleteFeatureAsync方法,传入要删除的Feature对象
FeatureTable featureTable = featureLayer.FeatureTable;
featureTable.DeleteFeatureAsync(targetFeature);

2.2 新增

  1. 获取FeatureTable对象
  2. 调用FeatureTable对象的CreateFeature方法获取一个Feature对象
  3. 设置改Feature对象的Geometry几何以及属性(通过SetAttributeValue方法)
  4. 调用FeatureTable的AddFeatureAsync方法,传入已经编辑好的Feature对象
FeatureTable featureTable = featureLayer.FeatureTable;
Feature feature = featureTable.CreateFeature();
feature.Geometry = new MapPoint(0,0);
feature.SetAttributeValue("Name", "test");//两个参数对应着属性名、属性值
await featureTable.AddFeatureAsync(feature);

2.3 修改属性

  1. 通过Select、Identify等方法获取到要修改的那一个要素Feature对象
  2. 使用SetAttributeValue修改属性表中的值,也可以直接设置Geometry属性来修改几何
  3. 修改完成后调用UpdateFeatureAsync方法更新
Feature targetFeature = (Feature)identifyResult.GeoElements[0];
targetFeature.SetAttributeValue("Name", "modify-test");//两个参数对应着属性名、属性值
featureLayer.FeatureTable.UpdateFeatureAsync(targetFeature);

3 栅格分析

Esri没有像矢量分析一样为栅格分析各工具都创建相应的方法以供直接调用,而是使用JSON字符串去定义处理方法和处理参数,步骤如下:

  1. 准备好函数定义的JSON字符串
  2. 使用RasterFunction类的FromJson方法传入JSON字符串初始化一个RasterFunction对象
  3. 设置栅格数据源(从RasterFunction中得到RasterFunctionArguments,进而得到RasterNames列表,调用SetRaster方法设置此列表的第一项为待处理的Raster对象)
  4. 新建Raster对象,传入RasterFunction对象
    其中以坡向计算为例,其JSON字符串定义如下所示
aspectJson =//定义坡向函数参数的JSON字符串
	@"{
	""raster_function_arguments"":
		{
		""type"":""Raster_function_arguments"",
		""raster"":{ ""name"":""raster"",""is_raster"":true,""type"":""Raster_function_variable""}
		},
	""raster_function"":{ ""type"":""Aspect_function""},
	""type"":""Raster_function_template""
	}";

核心代码

RasterFunction rasterFunction = RasterFunction.FromJson(aspectJson);
RasterFunctionArguments rasterFunctionArguments = rasterFunction.Arguments;
IReadOnlyList<string> myRasterNames = rasterFunctionArguments.GetRasterNames();
rasterFunctionArguments.SetRaster(myRasterNames.First(), currentRasterLayer.Raster);
Raster newRaster = new Raster(rasterFunction);

获得newRaster对象后可以以此新建一个RasterLayer对象,然后添加到MapView的OperationalLayers中即可在地图上显示处理结果。